iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

圖解Javascript面試題目30天系列 第 6

Day 06 Function是什麼?能吃嗎? (5) Pure Function

  • 分享至 

  • xImage
  •  

「這批很純... 純到你會怕」

來到了第六天,意味著即將完成鐵人賽1/5的旅程!今天就讓我們來看看什麼是 pure function 吧(´⊙ω⊙`)

16. What is a pure function 什麼是純函式?

A Pure function is a function where the return value is only determined by its arguments without any side effects. i.e, If you call a function with the same arguments 'n' number of times and 'n' number of places in the application then it will always return the same value.

@翻譯翻譯

純函式是一種回傳值只受到傳入的引數影響,而不會受到其他副作用影響的函式。也就是說,如果你在應用程式中使用到這一個函式,只要帶入的引數是相同的,每次的回傳值也都會是相同的。


而與之相反,若回傳值會受到其他副作用所影響,那麼這個函式就是 非純函式impure function ,接下來就讓我們來看看impure function與pure function的範例:

範例

今天的範例有用到箭頭函式curry化喔!試著看懂它吧~

//Impure 帶入同一個引數,卻得到不同結果,且會改變外面變數的值
let alreadyDrink = 0
const drinkWaterImpure = water => alreadyDrink += water

console.log(drinkWaterImpure(100)) // 100
console.log(drinkWaterImpure(100)) // 200
console.log(alreadyDrink) // 200

//Pure 帶入同一個引數,每次回傳值都一樣,且不會改變到外面變數的值
const drinkWaterPure = water => drinkedWater => drinkedWater += water

console.log(drinkWaterPure(100)(alreadyDrink)) // 300
console.log(drinkWaterPure(100)(alreadyDrink)) // 300
console.log(alreadyDrink) // 200

@翻譯翻譯:

  • 第一個函式 - 非純函式的部分,在內部的運算式中拿了外面的變數進來使用,並且在執行時令這個變數加上我們傳進來的引數。我們會發現,執行這個函式N次,會得到N種不同的結果。且執行完這個非純函式後,變數alreadyDrink也被改變了。

  • 而第二個函式 - 純函式,每次帶入同一個引數,都會得到一樣的回傳值。即時執行這個純函式N次,原本的變數alreadyDrink也沒有被改變。

其實我們可以發現,如果一個函式有從外面拿東西進來用,並且改變它,就會產生副作用,那麼這個函式就是非純函式。而純函式是非常重要的,因為這可以簡化單元測試(不會有副作用),而且無需相依注入。純函式也可以避免緊密的耦合,並且可以讓應用程式因為沒有副作用而更難被破壞。這些原則與ES6的不變性一同讓 const 的用途勝過於 let 。


明天就是function這個小主題的最後一篇囉,最後就來看看什麼是 閉包Closure 吧ヽ(́◕◞౪◟◕‵)ノ


後記

其實在這個面試題彙整原本的地方What is a pure function,給的範例是分別使用陣列的兩種方法: PushConcat來演示純函式與非純函式。

  • Push這個方法會影響到他作用的那個陣列,它本身也就是非純函式。且Push執行完的回傳值會是執行後的新陣列長度(length),所以執行這個函式每次的回傳值也都會不一樣。
  • Concat則不會影響到他作用的那個函式,反而是回傳一個全新的陣列來把帶入的兩個陣列引數連結在一起。

所以,在使用JavaScript方法時,要留意它是純的還是不純的喔( • ̀ω•́ )


上一篇
Day 05 Function是什麼?能吃嗎? (4) Lambda, or Arrow Functions
下一篇
Day 07 Function是什麼?能吃嗎? (6) Closures & Scope
系列文
圖解Javascript面試題目30天9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言